home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc™ Source Code / UI / ExcFocus.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  11.4 KB  |  394 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ExcFocus.cpp
  3.  
  4.     Contains:    Implementation of ODExclusiveFocusModule
  5.  
  6.     Owned by:    Chris Linn
  7.  
  8.     Copyright:    © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     6/21/96    CSL        1336201: Redundant transfer of focus sets
  13.                                     done redundantly. 1342963:
  14.                                     UnsetFocusOwnership doesn't call
  15.                                     AdjustBorderShape.
  16.         <24>    10/24/95    jpa        1293441: Eat exceptions in
  17.                                     ResolveClipboardPromises
  18.         <23>     10/8/95    TJ        Fixes Recomended by Refball
  19.         <22>     10/3/95    TJ        Changes done by RefBall Team
  20.         <21>      8/3/95    RR        #1257260: Collapse B classes. Remove
  21.                                     somInit methods. Don't call IsInitialized
  22.                                     or SubclassResponsibility
  23.         <20>     6/28/95    RR        1242642 BB Mostly ref counting. Release
  24.                                     border shape
  25.         <19>     6/25/95    TÇ        1242642 BB: Turn on ODDebug warning if
  26.                                     refcount is wrong in
  27.                                     ODRefCntObjectsomUninit.
  28.         <18>     5/31/95    RR        #1251403 Release after AcquirePart
  29.         <17>     5/26/95    RR        #1251403: Multithreading naming support
  30.         <16>     5/17/95    RR        #1250135/1250137/1250143 Getters increment
  31.                                     refcount
  32.         <15>     5/16/95    CC        1248632, 1244940: SetFocusOwnership:
  33.                                     Externalize the current clipboard draft to
  34.                                     force resolution of promises.
  35.         <14>     5/10/95    JBS        1241913 ODPart::AdjustBorderShape is not
  36.                                     called with null shape
  37.         <13>     4/28/95    RR        1211085 Remove 5$ comments
  38.         <12>      4/7/95    RR        #1216618 Added SOM_TRY etc.
  39.         <11>      4/6/95    RR        #1220104 Use of ODObjectsAreEqual, #1211085
  40.                                     Remove 5$ comments
  41.         <10>     3/13/95    NP        1228158: Always call UseInputWindow when
  42.                                     losing keystroke focus.
  43.          <9>      3/7/95    RR        #1220929 Added cache for selection focus
  44.          <8>      3/1/95    NP        1187682: Call UseInputWindow when keystroke
  45.                                     focus is lost.
  46.          <7>    10/27/94    RR        Call FocusLost in TransferFocus #1192168
  47.          <6>    10/18/94    RR        Added fSession. Detect change in selection
  48.                                     focus. Override BRF, CRF, ARF.
  49.          <5>     9/20/94    RR        When assigning a new frame to fFrame, call
  50.                                     Acquire on the new frame BEFORe
  51.                                     calling Release on the old, in case they're
  52.                                     the same frame.
  53.          <4>      9/2/94    RR        #1184275 Pass transferringFrame and
  54.                                     newOwner to focusModule::TransferFocus
  55.          <3>     8/24/94    RR        Fixed ref counting in SetFocusOwnership
  56.          <2>     8/23/94    RR        Call Acquire and Release
  57.          <1>     6/23/94    RR        first checked in
  58.  
  59.     To Do:
  60.     In Progress:
  61.         
  62. */
  63.  
  64.  
  65. #define ODExclusiveFocusModule_Class_Source
  66. #define VARIABLE_MACROS
  67. #include <ExcFocus.xih>
  68.  
  69. #ifndef _PLFMDEF_
  70. #include "PlfmDef.h"
  71. #endif
  72.  
  73. #ifndef _TEMPOBJ_
  74. #include <TempObj.h>
  75. #endif
  76.  
  77. #ifndef SOM_ODFrame_xh
  78. #include "Frame.xh"
  79. #endif
  80.  
  81. #ifndef SOM_Module_OpenDoc_Foci_defined
  82. #include "Foci.xh"
  83. #endif
  84.  
  85. #ifndef _ODSESSN_
  86. #include "ODSessn.xh"
  87. #endif
  88.  
  89. #ifndef SOM_ODPart_xh
  90. #include "Part.xh"
  91. #endif
  92.  
  93. #ifndef SOM_ODFrame_xh
  94. #include "Frame.xh"
  95. #endif
  96.  
  97. #ifndef SOM_ODFrameFacetIterator_xh
  98. #include "FrFaItr.xh"
  99. #endif
  100.  
  101. #ifndef SOM_ODArbitrator_xh
  102. #include <Arbitrat.xh>
  103. #endif
  104.  
  105. #ifndef SOM_ODClipboard_xh
  106. #include <Clipbd.xh>
  107. #endif
  108.  
  109. #ifndef __TEXTSERVICES__
  110. #include <TextServices.h>    // Platform-dependent
  111. #endif
  112.  
  113. //==============================================================================
  114. // Local function declarations
  115. //==============================================================================
  116.  
  117. ODStatic void ResolveClipboardPromises(Environment *ev, 
  118.                 ODFrame* selectionFrame,
  119.                 ODSession* session);
  120.  
  121. //==============================================================================
  122. // Class ODExclusiveFocusModule
  123. //==============================================================================
  124.  
  125. SOM_Scope void  SOMLINK ODExclusiveFocusModuleInitExclusiveFocusModule(ODExclusiveFocusModule *somSelf, Environment *ev,
  126.         ODSession* session)
  127. {
  128.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  129.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","InitExclusiveFocusModule");
  130.  
  131.     SOM_TRY    
  132.     
  133.         /* Moved from somInit. SOM itself sets fields to zero
  134.         _fFrame = kODNULL;
  135.         _fSession = kODNULL;
  136.         _fSelectionFocus = 0;
  137.         _fKeyFocus = 0;
  138.         */
  139.         
  140.         somSelf->InitFocusModule(ev, session);
  141.         _fSession = session;
  142.         _fSelectionFocus = session->Tokenize(ev,kODSelectionFocus);
  143.         _fKeyFocus = _fSession->Tokenize(ev, kODKeyFocus);
  144.  
  145.     SOM_CATCH_ALL
  146.     SOM_ENDTRY
  147. }
  148.  
  149.  
  150. SOM_Scope void  SOMLINK ODExclusiveFocusModulesomUninit(ODExclusiveFocusModule *somSelf)
  151. {
  152.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  153.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","somUninit");
  154.  
  155.     parent_somUninit(somSelf);
  156. }
  157.  
  158. SOM_Scope ODBoolean  SOMLINK ODExclusiveFocusModuleIsFocusExclusive(ODExclusiveFocusModule *somSelf, Environment *ev,
  159.         ODTypeToken focus)
  160. {
  161.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  162.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","IsFocusExclusive");
  163.  
  164.     ODUnused(focus);
  165.     return kODTrue;
  166. }
  167.  
  168. SOM_Scope void  SOMLINK ODExclusiveFocusModuleSetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  169.         ODTypeToken focus,
  170.         ODFrame* frame)
  171. {
  172.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  173.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","SetFocusOwnership");
  174.  
  175.     ODFacet* facet = kODNULL;
  176.     ODFrameFacetIterator* facets = kODNULL;
  177.  
  178.     SOM_TRY
  179.     
  180.         if ( _fFrame )
  181.             somSelf->UnsetFocusOwnership( ev, focus, _fFrame );
  182.  
  183.         if (frame)
  184.         {
  185.             if (focus == _fSelectionFocus)
  186.                 frame->DrawActiveBorder(ev);    // Note:  window->Update(ev);
  187.  
  188.             frame->Acquire(ev);        // Do this last in case exceptions occur above
  189.         }
  190.         _fFrame = frame;
  191.  
  192.     SOM_CATCH_ALL
  193.     SOM_ENDTRY
  194. }
  195.  
  196. SOM_Scope void  SOMLINK ODExclusiveFocusModuleUnsetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  197.         ODTypeToken focus,
  198.         ODFrame* frame)
  199. {
  200.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  201.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","UnsetFocusOwnership");
  202.  
  203.     SOM_TRY
  204.  
  205.         if (ODObjectsAreEqual(ev, frame, _fFrame))
  206.         {
  207.             if (focus == _fSelectionFocus) 
  208.             {
  209.                 if (_fFrame)
  210.                 {
  211.                     _fFrame->InvalidateActiveBorder(ev);
  212.  
  213.                     TempODFrame contFrame = _fFrame->AcquireContainingFrame(ev); // -- TÇ tempobj'd
  214.                     if ((ODFrame*) contFrame )
  215.                     {
  216.                         TempODPart contPart = contFrame->AcquirePart(ev); // -- TÇ tempobj'd
  217.                         ODFrameFacetIterator* facets = _fFrame->CreateFacetIterator(ev);
  218.                         ODFacet* facet = kODNULL;
  219.                         for ( facet = facets->First(ev);
  220.                                 facets->IsNotComplete(ev);
  221.                                 facet = facets->Next(ev) )
  222.                         {
  223.                             ODShape* border = contPart->AdjustBorderShape(ev, facet, kODNULL);
  224.                             ODReleaseObject(ev, border);
  225.                         }
  226.                         ODDeleteObject(facets);
  227.                     }
  228.                 }
  229.                 
  230.                 ResolveClipboardPromises(ev, _fFrame, _fSession);
  231.             }
  232.             else if (focus == _fKeyFocus)
  233.             {
  234.                 const TSMDocumentID    kAnyDoc = kODNULL;
  235.             
  236.                 // Make sure to set this back to a safe state.
  237.                 UseInputWindow(kAnyDoc, kODTrue);
  238.             }
  239.         
  240.         
  241.             if (_fFrame)
  242.                 _fFrame->Release(ev);
  243.             _fFrame = kODNULL;
  244.         }
  245.  
  246.     SOM_CATCH_ALL
  247.     SOM_ENDTRY
  248. }
  249.  
  250. SOM_Scope void  SOMLINK ODExclusiveFocusModuleTransferFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  251.         ODTypeToken focus,
  252.         ODFrame* transferringFrame,
  253.         ODFrame* newOwner)
  254. {
  255.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  256.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleTransferFocusOwnership");
  257.  
  258.     SOM_TRY
  259.  
  260.         TempODFrame oldOwner = somSelf->AcquireFocusOwner(ev, focus);
  261.  
  262.         // No need to do the transfer if the owner isn't changing        
  263.         if ( !ODObjectsAreEqual( ev, oldOwner, newOwner ))
  264.         {
  265.             somSelf->SetFocusOwnership(ev, focus, newOwner);
  266.             
  267.             if (oldOwner && (oldOwner != transferringFrame))
  268.             {
  269.                 TempODPart part = oldOwner->AcquirePart(ev);
  270.                 part->FocusLost(ev, focus, oldOwner);
  271.             }
  272.             if (newOwner && (newOwner != transferringFrame))
  273.             {
  274.                 TempODPart part = newOwner->AcquirePart(ev);
  275.                 part->FocusAcquired(ev, focus, newOwner);
  276.             }
  277.         }
  278.  
  279.     SOM_CATCH_ALL
  280.     SOM_ENDTRY
  281. }
  282.  
  283. SOM_Scope ODFrame*  SOMLINK ODExclusiveFocusModuleAcquireFocusOwner(ODExclusiveFocusModule *somSelf, Environment *ev,
  284.         ODTypeToken focus)
  285. {
  286.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  287.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","AcquireFocusOwner");
  288.  
  289.     ODUnused(focus);
  290.     if (_fFrame) {
  291.         SOM_TRY
  292.             _fFrame->Acquire(ev);
  293.         SOM_CATCH_ALL
  294.         SOM_ENDTRY
  295.     }
  296.     return _fFrame;
  297. }
  298.  
  299. SOM_Scope ODBoolean  SOMLINK ODExclusiveFocusModuleBeginRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  300.         ODTypeToken focus,
  301.         ODFrame* requestingFrame)
  302. {
  303.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  304.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleBeginRelinquishFocus");
  305.  
  306.     ODBoolean canRelinquish = kODTrue;
  307.     
  308.     SOM_TRY
  309.  
  310.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  311.     
  312.         if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner, requestingFrame)))
  313.         {
  314.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  315.             if ((ODPart*)part)
  316.                 canRelinquish = part->BeginRelinquishFocus(ev, focus, currentOwner, requestingFrame);
  317.         }
  318.  
  319.     SOM_CATCH_ALL
  320.     SOM_ENDTRY
  321.     
  322.     return canRelinquish;
  323. }
  324.  
  325. SOM_Scope void  SOMLINK ODExclusiveFocusModuleCommitRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  326.         ODTypeToken focus,
  327.         ODFrame* requestingFrame)
  328. {
  329.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  330.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleCommitRelinquishFocus");
  331.  
  332.     SOM_TRY
  333.  
  334.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  335.         
  336.         if ((currentOwner)  && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
  337.         {
  338.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  339.             if ((ODPart*)part)
  340.                 part->CommitRelinquishFocus(ev, focus, currentOwner, requestingFrame);
  341.         } 
  342.  
  343.     SOM_CATCH_ALL
  344.     SOM_ENDTRY
  345. }
  346.  
  347. SOM_Scope void  SOMLINK ODExclusiveFocusModuleAbortRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  348.         ODTypeToken focus,
  349.         ODFrame* requestingFrame)
  350. {
  351.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  352.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleAbortRelinquishFocus");
  353.  
  354.     SOM_TRY
  355.  
  356.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  357.         if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
  358.         {
  359.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  360.             if ((ODPart*)part)
  361.                 part->AbortRelinquishFocus(ev, focus, currentOwner,requestingFrame);
  362.         }
  363.  
  364.     SOM_CATCH_ALL
  365.     SOM_ENDTRY
  366. }
  367.  
  368. ODStatic void ResolveClipboardPromises(Environment *ev, 
  369.                 ODFrame* selectionFrame,
  370.                 ODSession* session)
  371. {
  372.     ODArbitrator* arbitrator = session->GetArbitrator(ev);
  373.  
  374.     ODToken        clipboardFocus = session->Tokenize(ev, kODClipboardFocus);
  375.     TempODFrame clipOwner = arbitrator->AcquireFocusOwner(ev, clipboardFocus);
  376.  
  377.     if ( (clipOwner == selectionFrame) || arbitrator->RequestFocus(ev, clipboardFocus, selectionFrame) )
  378.     {
  379.         ODClipboard* clipboard = session->GetClipboard(ev);
  380.         TRY{
  381.             ODStorageUnit* su = clipboard->GetContentStorageUnit(ev);
  382.             ODDraft* draft = su->GetDraft(ev);
  383.             draft->Externalize(ev);
  384.         }CATCH_ALL{
  385.             WARN("Error %d externalizing clipboard",ErrorCode());
  386.             // If this failed the Clipboard is probably hosed now.
  387.             clipboard->DiscardClipboard(ev);
  388.         }ENDTRY
  389.  
  390.         if ( clipOwner != selectionFrame )
  391.             arbitrator->RelinquishFocus(ev, clipboardFocus, selectionFrame);
  392.     }
  393. }
  394.